package com.gjzhao.fammll.listener;

import javax.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @Description: 消息提供方 - 监听类配置
 * - 为确保消息的可靠性，使用消息确认机制
 *      - 如果交换机有收到消息，返回结果就为 true
 *      - 如果交换机有收到消息，返回结果就为 false
 * - 同时可在回调的参数中，找到发送的消息
 * @Author: gjzhao
 * @Date Created in 2022-02-19 6:34 下午
 */
@Component
public class RabbitmqConfirmListener implements RabbitTemplate.ConfirmCallback { //作为消息提供方的监听器 需要实现 RabbitTemplate 的内部类 ConfirmCallback

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private AmqpTemplate amqpTemplate;

    @Autowired
    private RabbitTemplate rabbitTemplate; //注入确认回调需要的对象
    @PostConstruct //该注解表示 RabbitmqConfirmListener 对象构造之后，开始执行该方法
    public void init() {
        rabbitTemplate.setConfirmCallback(this); //将监听器配置给RabbitMq对象
    }


    /**
     * 消息确认机制逻辑处理
     *
     * @param correlationData
     * @param b 是否发送到交换机
     * @param s 发送的消息
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean b, String s) {

        logger.info("----收到交换机消息确认的反馈结果[消息确认机制]:{}----", b);

        if (b) {
            //1.如果发送成功，开始进行订单保存
            logger.info("----发送消息到交换机成功---");
        } else {
            //2.表示发送失败，可进行重写尝试几次，如果仍然发送失败，则停止重试
            logger.info("----发送消息到交换机失败---");
            amqpTemplate.convertAndSend("","orderQueue",s);
        }

    }
}
